package br.edu.ufam.controleAcesso

class UsuarioController {
    def dataSource
    
    def index = { redirect(action:list,params:params) }

    // the delete, save and update actions only accept POST requests
    def static allowedMethods = [delete:'POST', save:'POST', update:'POST']

    def list = {
 
    }

    def show = {
        def usuario = Usuario.get( params.id )
        def usuarioAplicacao = Aplicacao.executeQuery("select u.aplicacao from UsuarioAplicacao u where u.usuario.id = ? order by u.aplicacao.menu.descricao, u.aplicacao.descricao",[usuario.id])
        def grupoAplicacao = Aplicacao.executeQuery("select g.aplicacao from GrupoAplicacao g where g.grupo.id = ? order by g.aplicacao.menu.descricao, g.aplicacao.descricao",[usuario.grupo.id])

        if(!usuario) {
            flash.message = "Registro não encontrado!"
            redirect(action:list)
        }
        else { return [ usuario : usuario, usuarioAplicacao: usuarioAplicacao, grupoAplicacao: grupoAplicacao ] }
    }

    def edit = {
        def usuario = Usuario.get( params.id )
        def usuarioAplicacao = Aplicacao.executeQuery("select u.aplicacao from UsuarioAplicacao u where u.usuario.id = ?",[usuario.id])

        if(!usuario) {
            flash.message = "Registro não encontrado!"
            redirect(action:list)
        }
        else {
            return [ usuario : usuario, usuarioAplicacao: usuarioAplicacao ]
        }
    }

    def update = {
        def usuario = Usuario.get( params.id )
        if(params.senha) {
            params.senha = MD5Codec.encode(params.senha)//params.senha.encodeAsMD5()
            params.confirmaSenha = MD5Codec.encode(params.confirmaSenha)//params.confirmaSenha.encodeAsMD5()
        } else { // Se nao digitou senha mantem a mesma senha do objeto
            params.senha = usuario.senha
            params.confirmaSenha = usuario.senha
        }
        def aplicacao = null
        def listRemocao = []
        if (params.lista2.getClass() == (new String()).getClass()){
            params.lista2 = [params.lista2]
        }
        if(usuario) {
            Usuario.withTransaction{status ->
            usuario.properties = params
            usuario.nome = usuario.nome.encodeAsTratarStringUpper()
            def usuarioAplicacao = UsuarioAplicacao.findAll("from UsuarioAplicacao u where u.usuario = ?",[usuario])
                usuarioAplicacao.each{//loop para achar elementos que devem ser retirados do relacionamento
                    it.delete(flush:true)                               
                }

                params.lista2.each {                    
                    aplicacao = Aplicacao.get(String.valueOf(it.value))
                    usuarioAplicacao = new UsuarioAplicacao()
                    usuarioAplicacao.aplicacao = aplicacao
                    usuarioAplicacao.usuario = usuario
                    usuarioAplicacao.save(flush:true)
                }
           
                if(!status.isRollbackOnly() && !usuario.hasErrors() && usuario.save(flush:true)) {
                    flash.message = "Operação realizada com sucesso!"
                    redirect(action:show,id:usuario.id)
                }
                else {
                    render(view:'edit',model:[usuario:usuario])
                }
            }
        }
        else {
            flash.message = "Registro não encontrado!"
            redirect(action:edit,id:params.id)
        }
    }

    def create = {
        def usuario = new Usuario()
        usuario.properties = params
        return ['usuario':usuario]
    }

    def save = {
        if(params.senha) {
            params.senha = params.senha.encodeAsMD5()
            params.confirmaSenha = params.confirmaSenha.encodeAsMD5()
        }
        def usuario = new Usuario(params)
        usuario.nome = usuario.nome.encodeAsTratarStringUpper()
        if (params.lista2.getClass() == (new String()).getClass()){
            params.lista2 = [params.lista2]
        }
        Usuario.withTransaction{status ->
            usuario.save(flush:true)
            params.lista2.each {
                def aplicacao = Aplicacao.get(it)
                def usuarioAplicacao = new UsuarioAplicacao()
                usuarioAplicacao.aplicacao = aplicacao
                usuarioAplicacao.usuario = usuario
                usuarioAplicacao.save(flush:true)
            }
            if(!status.isRollbackOnly() && !usuario.hasErrors() && usuario.save(flush:true)) {
                flash.message = "Operação realizada com sucesso!"
                redirect(action:show,id:usuario.id)
            }
            else {
                render(view:'create',model:[usuario:usuario])
            }
        }
    }

    def delete = {
        def usuario = Usuario.get( params.id )
        if (usuario) {
            try {
                usuario.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])}"
            redirect(action: "list")
        }
    }


    def dosearch = {        
        if (params.offset) {
            params.offset = params.offset.toLong()
        }
        else {
            params.offset = 0
        }        
        def usuarios = Usuario.createCriteria().list(max:10, offset: params.offset){
            and
            {
                if (params.login && !params.login.isEmpty())
                {
                    params.login = "%" + params.login + "%"
                    ilike("login",params.login)
                }
                if (params.nome && !params.nome.isEmpty())
                {
                    params.nome = "%" + params.nome + "%"
                    ilike("nome",params.nome)
                }
                if (params.descricao && !params.descricao.isEmpty())
                {
                    grupo
                    {
                        params.descricao = "%" + params.descricao + "%"
                        ilike("descricao",params.descricao)
                    }
                }
            }
            order("nome")
        }
        [ usuarios : usuarios, qtd : usuarios.getTotalCount(), nome : params.nome, login : params.login, descricao : params.descricao ]
    }
}
